// 多态:父类型的引用指向了子类型的对象,不同类型的对象针对相同的方法,产生不同的行为
;(() => {
  // 定义一个父类
  class Animal {
    name: string
    constructor(name: string) {
      // 更新属性值
      this.name = name
    }
    //实例方法
    run(distance: number = 0) {
      console.log(`跑了${distance}米${this.name}`)
    }
  }
  // 定义一个子类
  class Dog extends Animal {
    // 构造函数
    constructor(name: string) {
      super(name)
    }
    run(distance: number = 10) {
      console.log(`跑了${distance}米${this.name}`)
    }
  }
  // 定义一个子类
  class Pig extends Animal {
    // 构造函数
    constructor(name: string) {
      super(name)
    }
    run(distance: number = 20) {
      console.log(`跑了${distance}米${this.name}`)
    }
  }
  // 实例化父类对象
  const ani: Animal = new Animal('动物')
  ani.run()
  // 实例化子类对象
  const dog: Dog = new Dog('狗')
  dog.run()

  const pig: Pig = new Pig('猪')
  pig.run()

  console.log('==================================')
  const dog1: Animal = new Dog('小狗')
  dog1.run()
  const pig1: Animal = new Pig('小猪')
  pig1.run()

  function showRun(ani: Animal) {
    ani.run()
  }
  showRun(dog1)
  showRun(pig1)
})()
